带有鸭子类型对象的打字稿字符串文字
Posted
技术标签:
【中文标题】带有鸭子类型对象的打字稿字符串文字【英文标题】:Typescript string literal with duck-typed object 【发布时间】:2016-07-24 18:23:10 【问题描述】: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:字符串; c:字符串; ' 不可分配给“ITest”类型的参数。 属性“a”的类型不兼容。 类型 'string' 不可分配给类型 '"hi" | “再见”'。 类型 'string' 不能分配给类型 '"bye"'。
我希望它能够工作,因为它符合界面的要求,但我可能忽略了一些东西。
【问题讨论】:
a、b 和 c 是测试中的字符串类型,“hi” |在您的界面中输入“再见”。 这是有道理的,尽管它有点违反直觉。谢谢。 【参考方案1】: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)
之前为其分配不同的值——例如. 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
【讨论】:
以上是关于带有鸭子类型对象的打字稿字符串文字的主要内容,如果未能解决你的问题,请参考以下文章