interface A {
a: number;
}
interface B extends A {
b: number;
}
let ab: A | B = {
a: 1
};
ab.b = 2;
我認爲這是一個有效的代碼 - 首先作爲A
ab
,然後加入域之後,我希望它作爲一個B
。不幸的是它沒有:聯盟類型的演技在意想不到的方式
/usr/local/lib/node_modules/ts-node/src/index.ts:307
throw new TSError(formatDiagnostics(diagnosticList, cwd, ts, lineOffset))
^
TSError: ⨯ Unable to compile TypeScript
test.ts (13,4): Property 'b' does not exist on type 'A'. (2339)
at getOutput (/usr/local/lib/node_modules/ts-node/src/index.ts:307:15)
at /usr/local/lib/node_modules/ts-node/src/index.ts:336:16
at Object.compile (/usr/local/lib/node_modules/ts-node/src/index.ts:496:11)
at Module.m._compile (/usr/local/lib/node_modules/ts-node/src/index.ts:392:43)
at Module._extensions..js (module.js:580:10)
at Object.require.extensions.(anonymous function) [as .ts] (/usr/local/lib/node_modules/ts-node/src/index.ts:395:12)
at Module.load (module.js:488:32)
at tryModuleLoad (module.js:447:12)
at Function.Module._load (module.js:439:3)
at Function.Module.runMain (module.js:605:10)
看起來好像它有錯誤的類型。它認爲ab
是A
類型,但它明確定義爲類型A | B
...
我做錯了什麼?或者,這是TypeScript不太好的類型系統的另一個實例嗎?
編輯:爲了澄清的事情,我想「或者」型,我認爲是工會的類型。我期待ab
是A | B
類型。在初始化作爲A
類型(因爲它只有A
的字段),並且在修改之後,我期望開始充當B
類型(因爲它具有B
的所有字段)。
」你正在分配沒有b屬性的對象,而且編譯器會在「 不正確。 'A | B'類型可以具有'b'屬性,或者如果不能使用不屬於這兩種類型的屬性,那麼會是聯合類型? – monnef
A | B類型可以具有'b'屬性,但'{a:1}'對象沒有這樣的屬性, – TSV
但是'ab'類型是'A |不''{a:數字; }(這相當於'A')。我正在修改'ab'而不是無類型的對象'{a:1}'。 – monnef