【发布时间】:2018-09-19 23:39:38
【问题描述】:
如果我有以下类型
interface Foo {
bar: string;
baz: number;
qux: string;
}
我可以使用typeof 键入一个参数,这样它只需要返回string 的Foo 的键('bar' 或'qux')?
【问题讨论】:
标签: typescript types
如果我有以下类型
interface Foo {
bar: string;
baz: number;
qux: string;
}
我可以使用typeof 键入一个参数,这样它只需要返回string 的Foo 的键('bar' 或'qux')?
【问题讨论】:
标签: typescript types
通过在映射类型中添加as 子句,我们现在可以将原始类型简化为:
type KeyOfType<T, V> = keyof {
[P in keyof T as T[P] extends V? P: never]: any
}
您可以在 Typscript 2.8 中使用条件类型:
type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp? P : never }[keyof T];
let onlyStrings: KeysOfType<Foo, string>;
onlyStrings = 'baz' // error
onlyStrings = 'bar' // ok
let onlyNumbers: KeysOfType<Foo, number>;
onlyNumbers = 'baz' // ok
onlyNumbers = 'bar' // error
【讨论】:
KeysOfType 以包含keyof T & { [P ....,否则我不能使用KeysOfType 来下标T。