使用鸭子类型的对象键入字符串文字
Typescript string literal with duck-typed object
Typescript 1.8引入了字符串文字类型。但是,当将对象作为参数传入时,如下所示:
const test = {
a: "hi",
b: "hi",
c: "hi"
};
interface ITest {
a: "hi" | "bye"
}
function testFunc (t: ITest) {
}
testFunc(test);
它失败了:
类型为"{a:string;b:sstring;c:string!}"的参数不可分配给类型为"ITest"的参数。属性"a"的类型不兼容。类型"string"不可分配给类型"hi"|"bye"。类型"string"不可分配给类型"bye"。
我希望它能工作,因为它符合接口的要求,但我可能忽略了一些东西。
test.a
的类型已被推断为string
而不是"hi"
。编译器正在比较类型,而不是初始字符串表达式。
为了实现这一点,您需要将该属性键入为"hi" | "bye"
:
type HiBye = "hi" | "bye";
const test = {
a: "hi" as HiBye,
b: "hi",
c: "hi"
};
interface ITest {
a: HiBye
}
function testFunc (t: ITest) {
}
testFunc(test);
请注意,在最初的情况下,编译器将test.a
的类型推断为"hi"
是没有意义的,因为您可以在test.a
到达testFunc(test)
-ex。test.a = "not hi"
。
附带说明:编译器即使是常量字符串变量也不会将类型推断为字符串表达式,这很好。这也会导致很多烦恼。。。想象一下:
const myVariableTypedAsHi = "hi"; // implicitly typed as "hi"
let otherVar = myVariableTypedAsHi; // otherVar implicitly typed as "hi"
otherVar = "test"; // error: cannot assign `"test"` to `"hi"`—well that would be annoying
相关文章:
- JavaScript 中数据库数据的未终止字符串文字
- 错误:JSON分析错误:使用角度转换时,属性名称必须是字符串文字
- 使用鸭子类型的对象键入字符串文字
- iMacros Firefox错误:“;未终止的字符串文字“;
- 为什么我得到“;非法字符语法错误未终止的字符串文字“;当我使用javascript时
- 谷歌闭包编译器如何处理引号(字符串文字)
- JavaScript 中未终止的字符串文字
- 换行符导致 JavaScript 中的错误“未终止字符串文字”
- 使用 Rhino 更改 JavaScript 字符串文字
- 铬 - 意外令牌 非法.火狐和.字符串文字
- 未终止的字符串文字 - Javascript
- 如何解决此字符串文字错误
- Vim将内容行转换为JavaScript字符串文字
- PHP 包含未终止的字符串文字消息
- JS未终止的字符串文字文档写入
- 字符转义:从 Python 字符串文字到 JSON,然后到 HTML
- 我不断收到未终止的字符串文字错误
- Javascript Regexp和“;字符串文字“;
- SyntaxError:未终止的字符串文字
- 为什么这个表达式在条件中返回实际的字符串文字