这篇打字稿:
enum Field {
age,
bugs,
}
interface Foo {
number_age: number;
number_bugs: number;
}
function makeFoo():Foo {
let ret = {};
let i = 0;
for (let key in Field) {
ret['number_'+key] = i++;
}
return ret;
}
在编译时抛出此错误:
$ tsc test.ts
test.ts(16,5): error TS2322: Type '{}' is not assignable to type 'Foo'.
Property 'number_age' is missing in type '{}'.
但是ret
在运行时肯定会有number_age
属性。我如何欺骗编译器知道number_age
和number_bugs
将在那里或以其他方式更改我的代码以便编译?
答案 0 :(得分:1)
您可以使用关键字ret
Foo
将是as
元素
enum Field {
age,
bugs,
}
interface Foo {
number_age: number;
number_bugs: number;
}
function makeFoo():Foo {
let ret = {} as Foo;
let i = 0;
for (let key in Field) {
ret['number_'+key] = i++;
}
return ret;
}
阅读有关type assertions的文档:
有时你最终会遇到更多关于a的事情 值比TypeScript的值。通常这会在你知道的时候发生 某个实体的类型可能比其当前类型更具体。
类型断言是告诉编译器的一种方式“相信我,我知道什么 我正在做。“类型断言就像在其他语言中的类型转换, 但不会对数据进行特殊检查或重组。它没有 运行时影响,纯粹由编译器使用。 TypeScript假定 你,程序员,你已经对你进行了任何特殊的检查 需要。
类型断言有两种形式。一个是“角括号”语法:
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
另一个是as-syntax:
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
两个样本是等价的。使用一个而不是另一个主要是选择偏好;但是,在使用带有JSX的TypeScript时,只允许使用as样式的断言。
答案 1 :(得分:0)
你离这里很远(你还要在number_0
上制作number_1
和Foo
属性,是这个吗?)所以它会更多工作比它值得“正确”检查这段代码。只需使用any
:
function makeFoo():Foo {
let ret: any = {};
let i = 0;
for (let key in Field) {
ret['number_'+key] = i++;
}
return ret;
}
答案 2 :(得分:0)
您应该使用强制转换运算符&lt; TYPE&gt;
enum Field {
age,
bugs,
}
interface Foo {
number_age: number;
number_bugs: number;
}
function makeFoo():Foo {
let ret = {};
let i = 0;
for (let key in Field) {
ret['number_'+key] = i++;
}
return <Foo>ret; // Here
}