在打字稿中,可以使用泛型添加属性键吗?
function f<T extends string>(k: T) {
return { [k]: 'test'; };
}
const obj = f('foo');
// some how assert that obj.foo exists
我有一个类似上面的函数,它接受一个键k
并使用{[identifier]: 'value'}
动态地将该键添加到一个对象。
我想知道是否可以捕获字符串文字类型,例如'some-key'
/ T extends string
并使用其他类型的文字。像这样:
interface F<T extends string> {
[T]: SomeRandomType;
otherKey: string;
anotherKey: number;
}
interface SomeRandomType { /* ... */ }
const f: F<'bar'> = /* ... */;
f.otherKey; // should work
f.anotherKey; // should work
f.bar; // should work
有什么想法吗?这不可能吗?
答案 0 :(得分:2)
是的,这可以使用mapped types和intersection types的创意组合。
您可以对&#34;任意字符串文字键控属性进行建模&#34;使用映射类型的情况。
type F<Keys extends string> = {
[K in Keys] : number;
}
const f : F<'bar'> = null;
f.bar; // typed as a number
f.wibble; // type error
请注意,映射类型必须是type
声明,而不是interface
s。不要问我有什么区别!
然后,使用交集类型运算符&
在顶部对其他属性进行分层。出于某种原因,您必须使用&
。您似乎不允许将这些属性声明为同一对象类型的一部分。
type F<Keys extends string> = {
[K in Keys] : number;
} & {
additionalKey1 : object;
additionalKey2 : string;
}
const f : F<'bar'> = null;
f.bar; // typed as a number
f.additionalKey1; // typed as an object