字面类型

除了通用类型 stringnumber 之外,我们还可以在类型位置引用特定的字符串和数字。

In addition to the general types string and number, we can refer to specific strings and numbers in type positions.

m9UflAZAqRk5aXZZbDFEhNz8qKsoB1bOOjFj9shoAQPbwtjMi/ROeuS2jvy0u1uKdtVHl1IXrC8T+u6TYuop8PmX95Nm9l4kuHa0uepQhCXJ5DTn4eANK8e/XOTnWFGw0zD8hdbA/6h1WffMU91LSqKvqlvaUgYFE7NDXZveHjKRn9xT99dfdudMOJooNrOrzdXAUFhj91afpzX5tjwbvyW7huc1GUWwA4OsCykPkSAu5bZmw5gXbqDQ7HIxzSCjZTDs4rMkz95yEkVIdUV0GI8nBUbCHZ3O6261wVlr4g1aeNc0SG1rIhakIx21IKJedIXKwwj70Jjg/mL5ONYyqknQKyBryza5hIphJaA9FEettqcJyhPqaBY93EVfuNhU1+XSOI6v8FA5hSiBgwC4T0PcqN0/FhUwiIKpUNVlhikEBMzoQuUtpgYC77z76zXGeeGdVC+vdn4kMyoa+fWNE80cgCHQbEXyh6zDKzPnMxaydJusIEVnEX7DVJNsD6SrJ4WPKy/4JATNISKtHO9BkFvZwuaGdKEiF7DAAtUGSrKWaDfcv9FlPHucxbWQ7psAvMoPiE5Uv/pMbmm1VK1LEFAgcvPm/cWRand6m8uStj+y/uEMMRM1e2n0p4XlVCDYNapciYJBo1+SGapDYYZYIiDoO2sizp5PCbkNQKzG1tRIJnXNU2PLlt4iprZy2biomu4Q+0iGlMn3c6hr01vj2yqJPLmEpCUAMFVhArBQiZmU4VxXU4rybtFd1aVVHulV82JO5NNBSb3klY6tzo9uwQ==

let changingString = "Hello World";
changingString = "Olá Mundo";
// Because `changingString` can represent any possible string, that
// is how TypeScript describes it in the type system
changingString;
// ^?

const constantString = "Hello World";
// Because `constantString` can only represent 1 possible string, it
// has a literal type representation
constantString;
// ^?

TDsy759HLVdtq48KyF5KUAgUaUVA54UF/t+EjjCOF7Sv5bxkOxFo4wSKS5NL6SXzoBIrP1ypOTnhsV+PVGil9VGEtWScGg6pX9gzw6Ct7v0POBIK9EN01tevbGwnd5Yfv62Val7YA5cgPTr0KxqxPoVYRuhHHZS6LrmbYwTS3bQCqiXHvy8wA8vvOxF7+ogH

let x: "hello" = "hello";
// OK
x = "hello";
// ...
x = "howdy";

1c9klwaFhq9gGaxoCYrE6vEDvHEd+L+XVbWwotNbjB2SDBb/8Plo0ufxMlKAEsLoK+Gake4ayAWXKrQnxq8AnVsdRLFY8rY+JU4b9kNAtOw2VWb4sODuu53JOGVAN/60GCj8guA8NsjQtCxUviicrLE81z0VqNdemaqdUtdnL3xHO0JDm6Gjr9pVMs/bVoqW

sIj5RN13tMCRtc/lEI0/lpuxak9CIe7a2ErB6YHQzccP830u9r2EKqZWi9Vcxq+GqI3sKBlKvtQ7i0ZUt2HLsBhWoE1t9D/mvBnlm18Lvg60tTNW+Ihwt6MVmJ6LciWpZzVxO0p4zAnq1O+8rWg/s1nXjrRHWbV5zEbgd1fehHrhpR/7iixUztfsDZwoJTbZHZOVy8Bbc64KhWdFyilpqPc6Pff2AlG5r/qAg1Atvn9HIeLEUzDxqrB5BAvkLQNMhBsqSJzErrku2UEd0sC5YmeXNUKbQ6qkFvIIMvDDVUwKXtLxJ27iM8Fh+JywRSOhjXvRmnWT/VqEW1tkDtACmKD2ARcloGLHrkSw72YXrA+JJ5DCc9Ykp2XucXdB7pJnxtt/8qZJwUQDa7s6jQ/3EvTayCb8ODWMvSbGjHcmuS4=

function printText(s: string, alignment: "left" | "right" | "center") {
  // ...
}
printText("Hello, world", "left");
printText("G'day, mate", "centre");

iIv/vocFn03VtgIALl49IHksqKF0hxu9ONnRSLhV1H9LtV5zTrey0eIgO9kapbpjT34fFB851xnMra7rmoPyhPOLGruwZksRWKLLKiR+LEwPyEW48PPMjacUfUSk11F92ljVVV3WF+nSo652cSCw/A==

function compare(a: string, b: string): -1 | 0 | 1 {
  return a === b ? 0 : a > b ? 1 : -1;
}

+bLRd9nhj+XKL4PU//v4nfoFi2fQpI/guD3jY55xt99b4a+67GxBn8YXzDSwHpVl024KM+8nyLNzjR84ZRLukUSivxsn2Pj8xrbPepLpyAOv3qyPerV4qNtCZpxsz/7O9pRzVfOigCjQ4R7cVD20XeIzN7NnmfdL1Oov3gmft3xlxj7IG3nd8Lf3T0pEkCdK

interface Options {
  width: number;
}
function configure(x: Options | "auto") {
  // ...
}
configure({ width: 100 });
configure("auto");
configure("automatic");

mVsR9t+ernSKBbvVJ0cncZgyM3Te3mk52+oTpS5k9SpgdKj5ENi5mGmo0JJvujKGa63HuM1rS1GV9B+xKl+EsvJbCsm+EqtkqEmoLnW+olr5Iq5+VDSPQqFSABpAzz2ePjMgI2ddQFhaB1drfgWs9uuhCS8V7mZD8odyjXNmj0tOAp2u9BOFv9xFAcXZsB0GkMiwl10bvjmgH4R18hzJnP4m0e43YwMKAHrYI11yRdTjwngauban79cdntcqRddQ8B2pCFPYKF5fxbqtvxTnEEwR8iImS2TZyIt6GrPWbkPL8BehYSuIb4LGueCgCUV7ksKy/7twzti4qcazLU5njRx0RfUd6LVy3Ydjf85yFmHI+k7xpNhllaPiT3Zoe9P7+qS58vXLrtf9PhHzM74ekke2Jjw2h93toOLrJy7+fzMLU0K9nrfMv2a8kJz95rle4okXItQpr8MAcEaFw9yoSP3Skudkj3O2n8JsZ9N4VxT5UOFpYrJL/NQcaV7HOYSZdYjnsMaSJ9ceA5Fwt4XtVmJWQgwfmWJX+CbNIjfS4yWp+63PyF0iKeo1/lG4ex7Ua33QMB4sn2mkyGZ/aLxNq4ZDar8+dsGdSpkDjfZS48CdeZxZbxC8E+Q1GcdUEt8IM68lyQU5JNnhD7f7O4RyK4iYbvvPm4JhmEs/coFUP4qU2sC4Hw9YUMdBK+WzjDMH+E5syOh8+b38tW3F2TH9/pAIHl/hf3FkAW0tT+743WeDEbXklQ5ZP7V3cB13uFTE