在打字稿泛型中使用通配符
Using wildcard in typescript generics
这可能是一个简单的解决方案,只是我还没有遇到过。给定一个像 func<T, D = any>(param1: T, param2: D) { ... }
这样的打字稿函数,我用两个参数 param1
和 param2
调用它。是否可以在不指定 T
类型的情况下指定 D
的类型,以便打字稿仍然推断 T
的类型但强制执行 D
的类型?
示例: 假设我想强制使用外部接口定义的类型调用此函数:
export interface Data {
field1: string;
field2: boolean;
}
我现在可以使用 func('Hello', {field1: 'World', field2: true})
(这不能确保 param2
是一个有效的 Data
对象)或者我可以使用 func<string, Data>('Hello', {field1: 'World', field2: true})
。我不想做的是func<any, Data>('Hello', {field1: 'World', field2: true})
。有解决办法吗?
这称为部分参数推理,目前不支持。有一个添加这个的提议,但据我所知,它并没有被积极地细读。
您可以使用函数柯里化来实现这一点,尽管结果不是那么漂亮:
function func<T>(param1: T) {
return function <D>(param2: D) {
return [param1, param2]
}
}
export interface Data {
field1: string;
field2: boolean;
}
let a = func("Hi")<Data>({
field1: "",
field2: true
})
let b = func("Hi")<Data>({
field1: 1, // err
field2: true
})
这可能是一个简单的解决方案,只是我还没有遇到过。给定一个像 func<T, D = any>(param1: T, param2: D) { ... }
这样的打字稿函数,我用两个参数 param1
和 param2
调用它。是否可以在不指定 T
类型的情况下指定 D
的类型,以便打字稿仍然推断 T
的类型但强制执行 D
的类型?
示例: 假设我想强制使用外部接口定义的类型调用此函数:
export interface Data {
field1: string;
field2: boolean;
}
我现在可以使用 func('Hello', {field1: 'World', field2: true})
(这不能确保 param2
是一个有效的 Data
对象)或者我可以使用 func<string, Data>('Hello', {field1: 'World', field2: true})
。我不想做的是func<any, Data>('Hello', {field1: 'World', field2: true})
。有解决办法吗?
这称为部分参数推理,目前不支持。有一个添加这个的提议,但据我所知,它并没有被积极地细读。
您可以使用函数柯里化来实现这一点,尽管结果不是那么漂亮:
function func<T>(param1: T) {
return function <D>(param2: D) {
return [param1, param2]
}
}
export interface Data {
field1: string;
field2: boolean;
}
let a = func("Hi")<Data>({
field1: "",
field2: true
})
let b = func("Hi")<Data>({
field1: 1, // err
field2: true
})