如果我尝试使用具有类型约束的泛型类型的对象常量,则会遇到类型错误,我正在努力找出原因:
type WithKey = {
readonly akey: string;
}
function listOfThings<T extends WithKey>(one: T) {
// This is ok
const result2: Array<T> = [one];
//This errors with Type '{ akey: string; }' is not assignable to type 'T'.
const result: Array<T> = [{ akey: 'foo' }];
return result;
}
答案 0 :(得分:2)
不接受{ akey: 'foo' }
的原因是因为T
仅扩展 WithKey
,所以实际上是WithKey
的对象是' t必须可分配给T
。例如:
listOfThings<{ akey: string; aflag: boolean }>()
{ akey: 'foo' }
不满足{ akey: string; aflag: boolean }
。
您可以使用断言强制编译器:
const result: Array<T> = [{ akey: 'foo' } as T];
但这为您打开了一个漏洞,因为在第一个示例中它将编译,但在运行时不是正确的。似乎这不是您想要的,或者类型不能描述您想要的。
答案 1 :(得分:1)
{ akey: 'foo' }
实际上具有类型,不是通用类型。这就是为什么它不喜欢您的作业。
编译器无法将{ akey: 'foo' }
理解为WithKey类型。
您可以通过强制转换此打字稿来强制打字稿
const result: Array<T> = [<T>{ akey: 'foo' }];